package proyectosdservidor;

/**
 * Clase LH*, calcula la dirección de un servidor, tomando como imput
 * el RID del registro (numérico) y la cantidad de servidores conocidos.
 */
public class LH {


    /**
     * Calcula la dirección LH, en base al registro y a la cantidad de
     * servidores conocidos N.
     * @param RID
     * @param N
     * @return
     */
    public int calcularLH(String RID, int N){
        int rid = Integer.parseInt(RID);

        int nivel = calcularNivel(N);
        int split = (N - (int)Math.pow(2, nivel));

        int dir = rid % ((int)Math.pow(2, nivel));

        if(dir < split){
            dir = rid % ((int)Math.pow(2,nivel+1));
        }
        return dir;
    }


    /**
     * Calcula el nivel, dado una cantidad de baldes N.
     * @param N
     * @return
     */
    private int calcularNivel(int N){
        
        for (int i = 0; i <= 5; i++){
            int p = (int)Math.pow(2, i);
            if(p > N){
                return (i-1);
            }
        }
        return 0;
    }



}
